package com.yupi.yupicturebackend.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.boot.jackson.JsonComponent;
import org.springframework.context.annotation.Bean;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

/**
 * Spring MVC Json 配置类。
 * 主要用于解决前端 JavaScript 由于数值精度范围有限，导致从后端接收的 Long 类型数据发生精度丢失的问题，
 * 这会影响前端页面获取到的数据结果准确性。
 */
@JsonComponent // 注解表明该类是一个 Jackson JSON 组件，Spring Boot 会自动发现并注册它。
public class JsonConfig {

    /**
     * Bean 方法：创建一个自定义配置的 ObjectMapper 实例。
     * 通过添加 Serializer 来序列化 Long 类型为字符串形式，避免精度丢失。
     *
     * @param builder Jackson2ObjectMapperBuilder 实例，用于构建 ObjectMapper。
     * @return 自定义配置后的 ObjectMapper 实例。
     */
    @Bean
    public ObjectMapper jacksonObjectMapper (Jackson2ObjectMapperBuilder builder) {
        // 创建一个不支持 XML 映射的 ObjectMapper 实例。
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        // 创建一个新的 SimpleModule 实例，用于注册自定义序列化和反序列化逻辑。
        SimpleModule module = new SimpleModule();
        // 添加 Long 类型和 long 基本类型的序列化器，将它们序列化为字符串形式。
        // ToStringSerializer.instance 是一个预定义的序列化器，它会将对象转换成其 toString() 方法的结果。
        module.addSerializer(Long.class, ToStringSerializer.instance);
        module.addSerializer(Long.TYPE, ToStringSerializer.instance);
        // 将自定义的 SimpleModule 注册到 ObjectMapper 中，使得这些序列化规则生效。
        objectMapper.registerModule(module);

        return objectMapper;
    }
}
